package com.ktjiaoyu.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

import java.text.SimpleDateFormat;
import java.util.Date;

public class BaseController {
    private static final Logger LOGGER = LoggerFactory.getLogger(BaseController.class);

    // 转发方法
    public String forward(String url) {
        return UrlBasedViewResolver.FORWARD_URL_PREFIX + url;
    }

    // 重定向方法
    public String redirect(String url) {
        return UrlBasedViewResolver.REDIRECT_URL_PREFIX + url;
    }

    //获取request对象方式
    // @Autowired
    //  private HttpServletRequest request;
    public HttpServletRequest request() {
        //获取request对象方式2
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }

    //设置数据到request作用域中
    public void request(String name, Object obj) {
        request().setAttribute(name, obj);
    }

    //从request作用域中获取数据
    public <T> T request(String name) {
        return (T) request().getAttribute(name);
    }

    //获取session对象
    public HttpSession session() {
        return request().getSession();
    }

    //设置数据到session作用域中
    public void session(String name, Object obj) {
        session().setAttribute(name, obj);
    }

    //从session作用域中获取数据
    public <T> T session(String name) {
        return (T) session().getAttribute(name);
    }

    //解决springmvc 日期类型无法绑定的问题
    @InitBinder //控制器方法执行前执行该方法,将日期类型转换为指定的格式
    //dataBinder:数据绑定器,可以将请求参数绑定到指定的对象中
    //WebDataBinder:Web数据绑定器,可以将请求参数绑定到指定的对象中,并支持自定义的类型转换
    //CustomDateEditor:自定义日期编辑器,可以将请求参数转换为指定的日期格式
    //SimpleDateFormat:简单日期格式,可以将日期格式化为指定的格式
    //true:是否允许为空,如果为空,则不进行转换     false:不允许为空,如果为空,则抛出异常      默认为false    可以不写
    public void initBinder(WebDataBinder dataBinder) {
        LOGGER.info("进入BaseController的initBinder方法");
        dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }
}
